package main

import (
	"context"
	"fmt"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"

	"pbj-server/config"
	"pbj-server/internal/handler"
	"pbj-server/internal/middleware"
	"pbj-server/internal/model"
	"pbj-server/internal/service"
	"pbj-server/pkg/database"
	"pbj-server/pkg/logger"
	// "pbj-server/pkg/redis"  // 暂时禁用Redis
	"pbj-server/pkg/sms"

	"github.com/gin-gonic/gin"
)

// @title PBJ Server API
// @version 1.0
// @description PBJ Server REST API 服务
// @termsOfService http://swagger.io/terms/

// @contact.name API Support
// @contact.url http://www.swagger.io/support
// @contact.email support@swagger.io

// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html

// @host localhost:8080
// @BasePath /api/v1

// @securityDefinitions.apikey BearerAuth
// @in header
// @name Authorization
// @description 请输入Bearer token

func main() {
	// 初始化配置
	if err := config.Init(); err != nil {
		panic(fmt.Sprintf("配置初始化失败: %v", err))
	}

	// 初始化日志
	if err := logger.Init(); err != nil {
		panic(fmt.Sprintf("日志初始化失败: %v", err))
	}
	log := logger.GetLogger()
	log.Info("PBJ Server 启动中...")

	// 初始化数据库连接
	if err := database.Init(); err != nil {
		log.Fatalf("数据库初始化失败: %v", err)
	}
	defer database.Close()

	// 初始化Redis连接
	// if err := redis.Init(); err != nil {
	// 	log.Fatalf("Redis初始化失败: %v", err)
	// }
	// defer redis.Close()

	// 初始化SMS服务
	if err := sms.Init(); err != nil {
		log.Fatalf("SMS服务初始化失败: %v", err)
	}

	// 自动迁移数据库表结构
	if err := model.AutoMigrate(); err != nil {
		log.Fatalf("数据库迁移失败: %v", err)
	}

	// 设置Gin模式
	if config.GetConfig().App.Mode == "release" {
		gin.SetMode(gin.ReleaseMode)
	}

	// 创建Gin引擎
	r := gin.New()

	// 使用中间件
	r.Use(middleware.Logger())    // 日志中间件
	r.Use(middleware.Recovery())  // 恢复中间件
	r.Use(middleware.CORS())      // CORS中间件

	// 初始化服务层
	userService := service.NewUserService()
	smsService := service.NewSMSService()

	// 初始化处理器
	userHandler := handler.NewUserHandler(userService)
	smsHandler := handler.NewSMSHandler(smsService)

	// 设置路由
	setupRoutes(r, userHandler, smsHandler)

	// 创建HTTP服务器
	srv := &http.Server{
		Addr:    fmt.Sprintf(":%d", config.GetConfig().App.Port),
		Handler: r,
	}

	// 优雅关闭服务器
	go func() {
		log.Infof("服务器启动在端口 %d", config.GetConfig().App.Port)
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("服务器启动失败: %v", err)
		}
	}()

	// 等待中断信号
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit
	log.Info("正在关闭服务器...")

	// 设置关闭超时
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	if err := srv.Shutdown(ctx); err != nil {
		log.Fatal("服务器强制关闭:", err)
	}

	log.Info("服务器已退出")
}

// setupRoutes 设置路由
func setupRoutes(r *gin.Engine, userHandler *handler.UserHandler, smsHandler *handler.SMSHandler) {
	// API版本组
	v1 := r.Group("/api/v1")
	{
		// 健康检查
		v1.GET("/health", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{
				"status":  "ok",
				"message": "PBJ Server is running",
				"time":    time.Now().Format(time.RFC3339),
			})
		})

		// 用户相关路由
		users := v1.Group("/users")
		{
			users.POST("/register", userHandler.Register)
			users.POST("/login", userHandler.Login)
			users.GET("/profile", middleware.AuthMiddleware(), userHandler.GetProfile)
			users.PUT("/profile", middleware.AuthMiddleware(), userHandler.UpdateProfile)
		}

		// SMS相关路由
		sms := v1.Group("/sms")
		{
			sms.POST("/send", smsHandler.SendSMS)
			sms.POST("/verify", smsHandler.VerifyCode)
		}

		// 管理后台路由
		admin := v1.Group("/admin")
		admin.Use(middleware.AuthMiddleware(), middleware.AdminMiddleware())
		{
			admin.GET("/users", userHandler.GetAllUsers)
			admin.GET("/users/:id", userHandler.GetUserByID)
			admin.PUT("/users/:id", userHandler.UpdateUser)
			admin.DELETE("/users/:id", userHandler.DeleteUser)
		}
	}
} 